package com.clf.data.redis.core.json.ops.impl;

import com.clf.data.redis.core.json.FastJsonRedisTemplate;
import com.clf.data.redis.core.json.ops.FastJsonBoundListOperations;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundListOperations;

import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * ops覆盖类，可提供原先ops没有的方法
* @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
* @version 
* @since JDK 1.6
* create on 2017年3月31日
* Copyright 2017 ZZJR All Rights Reserved.
*
*/
public class FastJsonBoundListOperationsImpl<K,V> extends OperationsAware<K, V> implements FastJsonBoundListOperations<K,V> {
	private BoundListOperations<K,V> ops;
	public FastJsonBoundListOperationsImpl(BoundListOperations<K,V> ops, FastJsonRedisTemplate<K,V> template){
		super(template);
		this.ops = ops;
	}
	
	
	private BoundListOperations<K,V> getOps(){
		return ops;
	}
	/**
	 * 得到当前key
	 */
	@Override
	public K getKey() {
		// TODO Auto-generated method stub
		return  (K) getOps().getKey();
	}
	/**
	 * 得到当前存储类型
	 */
	@Override
	public DataType getType() {
		// TODO Auto-generated method stub
		return getOps().getType();
	}
	/**
	 * 得到过期时间
	 */
	@Override
	public Long getExpire() {
		// TODO Auto-generated method stub
		return getOps().getExpire();
	}
	/**
	 * 设置过期时间
	 */
	@Override
	public Boolean expire(long timeout, TimeUnit unit) {
		// TODO Auto-generated method stub
		return getOps().expire(timeout, unit);
	}
	/**
	 * 设置过期日期
	 */
	@Override
	public Boolean expireAt(Date date) {
		// TODO Auto-generated method stub
		return getOps().expireAt(date);
	}
	/**
	 * 取消过期时间
	 */
	@Override
	public Boolean persist() {
		// TODO Auto-generated method stub
		return getOps().persist();
	}
	/**
	 * key重命名
	 */
	@Override
	public void rename(K newKey) {
		getOps().rename(newKey);
	}

	/**
	 * 获取从start到end下表的所有元素
	 */
	@Override
	public List<V> range(long start, long end) {
		// TODO Auto-generated method stub
		return getOps().range(start, end);
	}
	/**
	 * 修剪列表，保留从start到end下表的元素
	 */
	@Override
	public void trim(long start, long end) {
		getOps().trim(start, end);
	}
	/**
	 * 个数
	 */
	@Override
	public Long size() {
		// TODO Auto-generated method stub
		return getOps().size();
	}
	/**
	 * 从左边加入队列
	 */
	@Override
	public Long leftPush(V value) {
		// TODO Auto-generated method stub
		return getOps().leftPush(value);
	}
	/**
	 * 多个元素从左边加入队列
	 */
	@Override
	public Long leftPushAll(@SuppressWarnings("unchecked") V... values) {
		// TODO Auto-generated method stub
		return getOps().leftPushAll(values);
	}
	/**
	 * 从左边加入队列，如果该队列存在的话
	 */
	@Override
	public Long leftPushIfPresent(V value) {
		// TODO Auto-generated method stub
		return getOps().leftPushIfPresent(value);
	}
	/**
	 * 在存在的元素之前插入元素
	 */
	@Override
	public Long leftPush(V pivot, V value) {
		// TODO Auto-generated method stub
		return getOps().leftPush( pivot,  value);
	}
	/**
	 * 从右加入队列
	 */
	@Override
	public Long rightPush(V value) {
		// TODO Auto-generated method stub
		return getOps().rightPush(value);
	}
	/**
	 * 多个元素从右加入队列
	 */
	@Override
	public Long rightPushAll(@SuppressWarnings("unchecked") V... values) {
		// TODO Auto-generated method stub
		return getOps().rightPushAll(values);
	}
	/**
	 * 从右加入队列，如果该队列存在的话
	 */
	@Override
	public Long rightPushIfPresent(V value) {
		// TODO Auto-generated method stub
		return getOps().rightPushIfPresent(value);
	}
	/**
	 * 在某个元素之后加入元素
	 */
	@Override
	public Long rightPush(V pivot, V value) {
		// TODO Auto-generated method stub
		return getOps().rightPush(pivot,value);
	}
	/**
	 * 在指定位置加入元素
	 */
	@Override
	public void set(long index, V value) {
		// TODO Auto-generated method stub
		getOps().set(index, value);
	}
	/**
	 * 删除n个和给定值相同的元素
	 */
	@Override
	public Long remove(long count, Object value) {
		// TODO Auto-generated method stub
		return getOps().remove(count, value);
	}
	/**
	 * 获得指定位置的元素
	 */
	@Override
	public V index(long index) {
		// TODO Auto-generated method stub
		return (V) getOps().index(index);
	}
	/**
	 * 左边第一个元素出队
	 */
	@Override
	public V leftPop() {
		// TODO Auto-generated method stub
		return (V) getOps().leftPop();
	}
	/**
	 * 左边第一个元素出队，阻塞模式
	 */
	@Override
	public V leftPop(long timeout, TimeUnit unit) {
		// TODO Auto-generated method stub
		return (V) getOps().leftPop();
	}
	/**
	 * 右边第一个元素出队
	 */
	@Override
	public V rightPop() {
		// TODO Auto-generated method stub
		return (V) getOps().rightPop();
	}
	/**
	 * 右边第一个元素出队，阻塞模式
	 */
	@Override
	public V rightPop(long timeout, TimeUnit unit) {
		// TODO Auto-generated method stub
		return (V) getOps().rightPop(timeout,unit);
	}


}
